package com.ayu.wxgzh.ayucyy.chain;

import com.alibaba.fastjson.JSONObject;
import com.ayu.wxgzh.ayucyy.chain.handler.AbstractHandler;
import com.ayu.wxgzh.ayucyy.entity.BaseMessage;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Objects;

/**
 * @Author 徐林玉
 * @Description HandlerClient
 * @Date 2022/9/19 9:20
 * @Version 1.0
 */
@Component
public class HandlerClient {

    /**
     * 使用Spring注入:所有继承了AbstractCheckHandler抽象类的Spring Bean都会注入进来。Map的Key对应Bean的name,Value是name对应相应的Bean
     */
    @Resource
    private Map<String, AbstractHandler> handlerMap;


    @Value("${MessageChain.config:}")
    private  String messageConfig;




    public  AbstractHandler  getChainHandler(){
        HandlerConfig config = JSONObject.parseObject(messageConfig, HandlerConfig.class);
        AbstractHandler handler = getHandler(config);
        return handler;
    }



    /**
     * 获取处理器
     * @return
     */
    private AbstractHandler getHandler (HandlerConfig config) {
        //配置检查：没有配置处理器链路，则不执行校验逻辑
        if (Objects.isNull(config)) {
            return null;
        }
        //配置错误，则返回空
        String handler = config.getHandler();
        if (StringUtils.isBlank(handler)) {
            return null;
        }
        //配置了不存在的处理器，则返回空
        AbstractHandler abstractCheckHandler = handlerMap.get(config.getHandler());
        if (Objects.isNull(abstractCheckHandler)) {
            return null;
        }

        //处理器设置配置Config
        abstractCheckHandler.setConfig(config);

        //递归设置链路处理器
        abstractCheckHandler.setNextHandler(getHandler(config.getNext()));

        return abstractCheckHandler;
    }

}
